﻿// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;
using ICSharpCode.AvalonEdit.Document;
using System.Collections.Generic;
using System.ComponentModel;

namespace ICSharpCode.AvalonEdit.Folding
{
	/// <summary>
	/// Base class for folding strategies.
	/// </summary>
	public abstract class AbstractFoldingStrategy
	{
        BackgroundWorker _work = null;
        public AbstractFoldingStrategy()
        {
           
        }

        void _work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            object[] objs = e.Result as object[];
            FoldingManager manager = objs[0] as FoldingManager;
            IEnumerable<NewFolding> foldings = objs[1] as IEnumerable<NewFolding>;
            int firstErrorOffset = Convert.ToInt32(objs[2].ToString());
            manager.UpdateFoldings(foldings, firstErrorOffset);
        }

        void _work_DoWork(object sender, DoWorkEventArgs e)
        {
            object[] objs = e.Argument as object[];
            FoldingManager manager = objs[0] as FoldingManager;
            string text = objs[1].ToString();
            int firstErrorOffset;
             IEnumerable<NewFolding> foldings = CreateNewFoldings(text, out firstErrorOffset);
          
            e.Result = new object[] { 
                manager, 
                foldings,
                firstErrorOffset };
        }
		/// <summary>
		/// Create <see cref="NewFolding"/>s for the specified document and updates the folding manager with them.
		/// </summary>
        public void UpdateFoldings(FoldingManager manager, TextDocument document)
        {
            int firstErrorOffset;
            IEnumerable<NewFolding> foldings = CreateNewFoldings(document, out firstErrorOffset);
            manager.UpdateFoldings(foldings, firstErrorOffset);
        }
        public void UpdateFoldings(FoldingManager manager, string text)
        {
            if (_work == null)
            {
                _work = new BackgroundWorker();
                _work.DoWork += new DoWorkEventHandler(_work_DoWork);
                _work.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_work_RunWorkerCompleted);
            }
            if (_work.IsBusy)
                return;
            _work.RunWorkerAsync(new object[] { manager, text });
        }
		
		/// <summary>
		/// Create <see cref="NewFolding"/>s for the specified document.
		/// </summary>
        public abstract IEnumerable<NewFolding> CreateNewFoldings(TextDocument document, out int firstErrorOffset);
        public abstract IEnumerable<NewFolding> CreateNewFoldings(string text, out int firstErrorOffset);
	}
}
